package br.com.assinchronus.gui;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.*;

import org.apache.log4j.Logger;
//import br.com.assinchronus.ai.Arvore;
//import br.com.assinchronus.ai.Inteligencia;
import br.com.assinchronus.componentes.Casa;
import br.com.assinchronus.componentes.Peao;
import br.com.assinchronus.componentes.Pecas;
import br.com.assinchronus.componentes.Tabuleiro;
import br.com.assinchronus.negocio.JogadasEnum;
import br.com.assinchronus.negocio.RegraAI;
import br.com.assinchronus.negocio.RegraFinal;
import br.com.assinchronus.negocio.RegraGeral;

public class Gui extends JFrame implements ActionListener {

	public static final Logger logger = Logger.getLogger(Gui.class);

	/**
	 * SerialVersion
	 */
	private static final long serialVersionUID = 1L;
	
	private int nivel;

	private JMenu menu;
	private JMenuBar menuBar;
	private JButton[] buttons = new JButton[36];
	private JMenuItem menuNovoJogo;
	private JMenuItem menuAtualiza;
	private JMenu menuNivel;
	private JCheckBoxMenuItem nivel1;
	private JCheckBoxMenuItem nivel2;
	private JCheckBoxMenuItem nivel3;
	private JMenu menuHeuristica;
	private JCheckBoxMenuItem menuPosicional;
	private JCheckBoxMenuItem menuTriangulo;
	private JMenuItem menuSair;

	private ImageIcon iconWhite = new ImageIcon(getClass().getResource("/images/peca.png"));
	private ImageIcon iconBlack = new ImageIcon(getClass().getResource("/images/pecapreta.png"));
	private ImageIcon iconKingWhite = new ImageIcon(getClass().getResource("/images/dama.png"));
	private ImageIcon iconKingBlack = new ImageIcon(getClass().getResource("/images/damapreta.png"));

	private Map<JButton, Casa> mapaTabuleiro = new HashMap<JButton, Casa>();
	private Tabuleiro tabuleiro;
	private Casa casaInicial = null;
	private Casa casaFinal = null;
	private Casa[] tab;
	private RegraGeral regra = new RegraGeral();
	private RegraAI rIA = new RegraAI();
	private RegraFinal rf = new RegraFinal();
	private Map<Casa, List<Casa>> obrigatoria = null;
	boolean seq =false;
	/** Creates new form Tabuleiro */
	
	public Gui() {
		logger.info("Iniciando Jogo.");
		initComponents();
	}

	private void initComponents() {
		Color black = new Color(102, 102, 102);

		int coluna = 100;
		int linha = 20;
		tabuleiro = new Tabuleiro();
		tab = tabuleiro.constroiTabuleiro();

		for (int i = 35; i >= 1; i--) {
			if ((i) % 9 != 0) {
				buttons[i] = new JButton();
				buttons[i].setBackground(black);
				if (i % 9 != 0 && tab[i].getPeca() != null) {
					if (tab[i].getPeca().getCor() == Pecas.PRETA)
						buttons[i].setIcon(iconBlack);
					if (tab[i].getPeca().getCor() == Pecas.BRANCA)
						buttons[i].setIcon(iconWhite);
				}

				getContentPane().add(buttons[i]);
				buttons[i].setBounds(coluna, linha, 89, 89);
				buttons[i].addActionListener(this);
				mapaTabuleiro.put(buttons[i], tab[i]);

			}
			if (coluna == 640) {
				coluna = 10;
				linha += 90;
				continue;
			}
			if (coluna == 730) {
				coluna = 100;
				linha += 90;
				continue;
			}
			coluna += 180;

		}

		menuBar = new JMenuBar();
		menu = new JMenu("Jogo");
		menuNovoJogo = new JMenuItem("Novo Jogo");
		menuAtualiza = new JMenuItem("Atualização");
		menuNivel = new JMenu("Nivel");
		menuHeuristica = new JMenu("Heurística");
		menuSair = new JMenuItem("Sair");

		nivel1 = new JCheckBoxMenuItem("Iniciante");
		nivel2 = new JCheckBoxMenuItem("Intermediário");
		nivel3 = new JCheckBoxMenuItem("Avançado");

		nivel1.addActionListener(this);
		nivel2.addActionListener(this);
		nivel3.addActionListener(this);

		menuNivel.add(nivel1);
		menuNivel.add(nivel2);
		menuNivel.add(nivel3);

		menuPosicional = new JCheckBoxMenuItem("Posicional");
		menuTriangulo = new JCheckBoxMenuItem("Triangulo Defensivo");

		menuPosicional.addActionListener(this);
		menuTriangulo.addActionListener(this);

		menuHeuristica.add(menuPosicional);
		menuHeuristica.add(menuTriangulo);

		nivel2.setSelected(true);
		menuPosicional.setSelected(true);
		menuSair.addActionListener(this);
		setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
		setMinimumSize(new java.awt.Dimension(750, 800));
		setResizable(false);
		getContentPane().setLayout(null);

		menuBar.add(menu);
		menuBar.add(menuNivel);
		menuBar.add(menuHeuristica);
		menu.add(menuNovoJogo);
		menu.add(menuAtualiza);
		menu.add(menuSair);
		menuNovoJogo.addActionListener(this);
		menuAtualiza.addActionListener(this);
		setJMenuBar(menuBar);
		nivel = 4;
		pack();
	}

	public void actionPerformed(ActionEvent e) {


		if (obrigatoria == null) {
			obrigatoria = regra.verificaObrigatoria(tab, Pecas.BRANCA);
		}

		List<Casa> sequencia = null;
		if (e.getSource() instanceof JButton) {

			if (casaInicial == null) {
				if (mapaTabuleiro.get(e.getSource()).getPeca() != null && mapaTabuleiro.get(e.getSource()).getPeca().getCor() == Pecas.BRANCA) {
					if (obrigatoria.isEmpty()) {
						casaInicial = (Casa) mapaTabuleiro.get(e.getSource());
					} else {
						if (obrigatoria.containsKey(tab[mapaTabuleiro.get(e.getSource()).getPosicao()])) {
							casaInicial = (Casa) mapaTabuleiro.get(e.getSource());
						}
					}
				}
			} else if (casaInicial != null) {
				if (mapaTabuleiro.get(e.getSource()).getPeca() != null && mapaTabuleiro.get(e.getSource()).getPeca().getCor() == Pecas.BRANCA) {
					if (obrigatoria.isEmpty()) {
						casaInicial = (Casa) mapaTabuleiro.get(e.getSource());
					} else {
						if (obrigatoria.containsKey(mapaTabuleiro.get(e.getSource()).getPeca())) {
							casaInicial = (Casa) mapaTabuleiro.get(e.getSource());
						}
					}
				} else if (mapaTabuleiro.get(e.getSource()).getPeca() == null) {
					if (obrigatoria.isEmpty()) {
						casaFinal = (Casa) mapaTabuleiro.get(e.getSource());
						if (regra.verificaJogada(tab, tab[casaInicial.getPosicao()], tab[casaFinal.getPosicao()], false) != JogadasEnum.INVALIDA) {
							System.out.println("=======Jogador Jogou!=======");
							switch (rf.verificaFinal(tab, Pecas.PRETA)) {
							case VITORIA_BRANCO:
								JOptionPane.showMessageDialog(null, "Vitoria do jogador branco");
								break;
							case VITORIA_PRETO:
								JOptionPane.showMessageDialog(null, "Vitoria do jogador Preto");
								break;
							case EMPATE:
								
									JOptionPane.showMessageDialog(null, "Empate");
								break;
							case NORMAL:
								//empate = false;
								tab = (rIA.jogar(tab, nivel));
								atualizaTabuleiro(false);
								System.out.println("=======Computador Jogou!=======");
						//verificação de vitória após jogada do computador
								switch (rf.verificaFinal(tab, Pecas.BRANCA)) {
								case VITORIA_BRANCO:
									JOptionPane.showMessageDialog(null, "Vitoria do jogador branco");
									break;
								case VITORIA_PRETO:
									JOptionPane.showMessageDialog(null, "Vitoria do jogador Preto");
									break;
								}
						//fim da verificação de vitória após jogada do computador
								break;
							}
							atualizaMap();
							seq=false;
							obrigatoria = null;
							casaInicial = null;
							casaFinal = null;
						}
					} else {
						if (obrigatoria.get(tab[casaInicial.getPosicao()]).contains(tab[mapaTabuleiro.get(e.getSource()).getPosicao()])) {
							casaFinal = (Casa) mapaTabuleiro.get(e.getSource());
							if (regra.verificaJogada(tab, tab[casaInicial.getPosicao()], tab[casaFinal.getPosicao()], seq) != JogadasEnum.INVALIDA) {
								sequencia = regra.verificaSequencia(casaFinal, tab);
								if (!sequencia.isEmpty()) {
									obrigatoria.put(casaFinal, sequencia);
									casaInicial = casaFinal;
									casaFinal = null;
									atualizaTabuleiro(true);
									seq=true;
									return;
								}
								atualizaTabuleiro(false);
								System.out.println("=======Jogador Jogou!=======");
								switch (rf.verificaFinal(tab, Pecas.PRETA)) {
								case VITORIA_BRANCO:
									JOptionPane.showMessageDialog(null, "Vitoria do jogador branco");
									break;
								case VITORIA_PRETO:
									JOptionPane.showMessageDialog(null, "Vitoria do jogador Preto");
									break;
								case NORMAL:
									tab = (rIA.jogar(tab, nivel));
									atualizaTabuleiro(false);
									System.out.println("=======Computador Jogou!=======");
									switch (rf.verificaFinal(tab, Pecas.BRANCA)) {
									case VITORIA_BRANCO:
										JOptionPane.showMessageDialog(null, "Vitoria do jogador branco");
										break;
									case VITORIA_PRETO:
										JOptionPane.showMessageDialog(null, "Vitoria do jogador Preto");
										break;
									}
								}

								atualizaMap();
								seq=false;
								obrigatoria = null;
								casaFinal = null;
								casaInicial = null;
							}
						}
					}
				}
			}
		} else {
			if (e.getSource() == nivel1) {
				nivel2.setSelected(false);
				nivel3.setSelected(false);
				nivel = 2;
			}
			if (e.getSource() == nivel2) {
				nivel1.setSelected(false);
				nivel3.setSelected(false);
				nivel = 4;
			}
			if (e.getSource() == nivel3) {
				nivel1.setSelected(false);
				nivel2.setSelected(false);
				nivel = 6;
			}
			if (e.getSource() == menuSair){
				System.exit(0);
			}
			if (e.getSource() == menuNovoJogo) {
				this.dispose();
				java.awt.EventQueue.invokeLater(new Runnable() {
					public void run() {
						new Gui().setVisible(true);
					}
				});
			}
			if (e.getSource() == menuNovoJogo){
				
			}
		}
	}

	public void atualizaTabuleiro(boolean sequencia) {
		for (int i = 35; i >= 1; i--) {
			if (i % 9 != 0) {
				if (tab[i].getPeca() != null) {
					if (tab[i].getPeca().isCapturada() && sequencia == false) {
						tab[i].setPeca(null);
						buttons[i].setIcon(null);
						continue;
					}
					if (tab[i].getPeca() instanceof Peao) {
						if (tab[i].getPeca().getCor() == Pecas.PRETA)
							buttons[i].setIcon(iconBlack);
						if (tab[i].getPeca().getCor() == Pecas.BRANCA)
							buttons[i].setIcon(iconWhite);
					} else {
						if (tab[i].getPeca().getCor() == Pecas.PRETA)
							buttons[i].setIcon(iconKingBlack);
						if (tab[i].getPeca().getCor() == Pecas.BRANCA)
							buttons[i].setIcon(iconKingWhite);
					}
				} else {
					buttons[i].setIcon(null);
				}
			}
		}
	}

	private void atualizaMap() {
		mapaTabuleiro.clear();
		for (int i = 1; i < 36; i++) {
			mapaTabuleiro.put(buttons[i], tab[i]);
		}
	}

	public static void main(String args[]) {
		java.awt.EventQueue.invokeLater(new Runnable() {
			public void run() {
				new Gui().setVisible(true);
			}
		});
	}
}
